package com.springboot.springboot1.config;

import ch.qos.logback.core.db.DBHelper;
import com.springboot.springboot1.Bean.Pet;
import com.springboot.springboot1.Bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 * @author CKC
 * @ClassName:
 * @DateTime: 2021/1/28 13:22
 *
 * 1.配置类里面使用@Bean标注在方法上给容器注册组件，默认也是单实例的
 * 2.配置类本身也是组件
 * 3.proxyBeanMethods:   代理bean的方法
 * FuLL(proxyBeanMethods = true)  在外部多次调用组价获取的都是一个对象
 * Lite(proxyBeanMethods = false) 在外部多次调用组价获取的不是同一个对象（新创建的）
 * 组件依赖
 *
 * 4.@Import({User.class, DBHelper.class})
 * 给容器中自动创建出这两个类的组件（调用的是无参构造器创建实例对象的）,默认组件的名字就是全类名
 *
 * 5。 @ImportResource("classpath:beans.xml")：
 * 导入以前的Spring配置文件，使他生效
 */
//@Import({User.class, DBHelper.class})
//@EnableConfigurationProperties(Car.class)
@Configuration(proxyBeanMethods = true)/**告诉springboot这是一个配置类  相当于配置文件*/
@ImportResource("classpath:beans.xml") /**给容器导入原生的Spring属性配置文件  注意：有冲突的组件的优先级低于用@Bean注入属性的优先级*/
public class MyConfig {
    
    @ConditionalOnMissingBean(User.class)
    /**
     * 条件装配  看笔记
     * 容器中没有User组件，才给容器中注入一下组件；也可以标记在类上面，结果不多说
     * @ConditionalOnBean(User.class) 容器中有User组件，才给容器中注入一下组件；也可以标记在类上面，结果不多说
     **/
    @Bean
    public User user() {
        return new User("ckc", 21);
    }
    
    
    /**
     * proxyBeanMethods = true
     * 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     *
     * @return
     */
    @Bean("pet")  //自定义名字
    public Pet pet1() {
        return new Pet(21, "shfg");
    }
}
